[HVM] PCmark2005 running in WinXP needs following extension to mmio decoder.
authorkfraser@localhost.localdomain <kfraser@localhost.localdomain>
Thu, 19 Oct 2006 13:56:02 +0000 (14:56 +0100)
committerkfraser@localhost.localdomain <kfraser@localhost.localdomain>
Thu, 19 Oct 2006 13:56:02 +0000 (14:56 +0100)
Als fix some inconsistencies, the comments of mmio decoder use AT&T
ordering for operands, but the syntax looks like Intel asm. This leads
to much confusion.

Signed-off-by: Qing He <qing.he@intel.com>
xen/arch/x86/hvm/platform.c

index 5e33f2877ed3cf46de88706f1dc67c868ee6cbb9..d7e63ffa995bf3bcf75170e51b5cbde174864c8f 100644 (file)
@@ -367,8 +367,10 @@ static int hvm_decode(int realmode, unsigned char *opcode,
             *op_size = WORD;
     }
 
+    /* the operands order in comments conforms to AT&T convention */
+
     switch ( *opcode ) {
-    case 0x0A: /* or r8, m8 */
+    case 0x0A: /* or m8, r8 */
         mmio_op->instr = INSTR_OR;
         *op_size = BYTE;
         GET_OP_SIZE_FOR_BYTE(size_reg);
@@ -417,22 +419,28 @@ static int hvm_decode(int realmode, unsigned char *opcode,
         GET_OP_SIZE_FOR_NONEBYTE(*op_size);
         return reg_mem(*op_size, opcode, mmio_op, rex);
 
-    case 0x32: /* xor m8, r8*/
+    case 0x32: /* xor m8, r8 */
         mmio_op->instr = INSTR_XOR;
         *op_size = BYTE;
         GET_OP_SIZE_FOR_BYTE(size_reg);
         return mem_reg(size_reg, opcode, mmio_op, rex);
 
+    case 0x38: /* cmp r8, m8 */
+        mmio_op->instr = INSTR_CMP;
+        *op_size = BYTE;
+        GET_OP_SIZE_FOR_BYTE(size_reg);
+        return reg_mem(size_reg, opcode, mmio_op, rex);
+
     case 0x39: /* cmp r32/16, m32/16 */
         mmio_op->instr = INSTR_CMP;
         GET_OP_SIZE_FOR_NONEBYTE(*op_size);
         return reg_mem(*op_size, opcode, mmio_op, rex);
 
-    case 0x3A: /* cmp r8, r8/m8 */
+    case 0x3A: /* cmp m8, r8 */
         mmio_op->instr = INSTR_CMP;
         *op_size = BYTE;
         GET_OP_SIZE_FOR_BYTE(size_reg);
-        return reg_mem(size_reg, opcode, mmio_op, rex);
+        return mem_reg(size_reg, opcode, mmio_op, rex);
 
     case 0x3B: /* cmp m32/16, r32/16 */
         mmio_op->instr = INSTR_CMP;
@@ -480,16 +488,16 @@ static int hvm_decode(int realmode, unsigned char *opcode,
         }
     }
 
-    case 0x84:  /* test m8, r8 */
+    case 0x84:  /* test r8, m8 */
         mmio_op->instr = INSTR_TEST;
         *op_size = BYTE;
         GET_OP_SIZE_FOR_BYTE(size_reg);
-        return mem_reg(size_reg, opcode, mmio_op, rex);
+        return reg_mem(size_reg, opcode, mmio_op, rex);
 
-    case 0x85: /* text m16/32, r16/32 */
+    case 0x85: /* test r16/32, m16/32 */
         mmio_op->instr = INSTR_TEST;
         GET_OP_SIZE_FOR_NONEBYTE(*op_size);
-        return mem_reg(*op_size, opcode, mmio_op, rex);
+        return reg_mem(*op_size, opcode, mmio_op, rex);
 
     case 0x87:  /* xchg {r/m16|r/m32}, {m/r16|m/r32} */
         mmio_op->instr = INSTR_XCHG;